package club.service.impl;

import club.dao.AnswerMapper;
import club.dao.CommentMapper;
import club.dao.UserMapper;
import club.pojo.Answer;
import club.pojo.Comment;
import club.pojo.User;
import club.service.AnswerService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 评论回复服务实现类
 * 处理评论回复的业务逻辑，包括查询回复列表、创建回复、关联用户和评论信息等
 */
@Service
@Transactional // 声明式事务管理，确保数据库操作的原子性
public class AnswerServiceImpl implements AnswerService {

    @Resource
    private AnswerMapper answerMapper;
    // 回复数据访问层

    @Resource
    private CommentMapper commentMapper;
    // 评论数据访问层

    @Resource
    private UserMapper userMapper;
    // 用户数据访问层

    /**
     * 查询某条评论的所有回复（包括一级回复和二级回复）
     * @param commentId 评论ID
     * @return 回复列表，包含关联的用户和被回复的回复对象
     */
    @Override
    public List<Answer> answersAboutOneComment(Integer commentId) {
        // 1. 构建查询条件：根据评论ID筛选回复
        EntityWrapper<Answer> wrapper = new EntityWrapper<>();
        if (commentId != null) {
            wrapper.eq("commentId", commentId);
            // 条件：commentId等于传入参数
        }

        // 2. 查询该评论下的所有回复
        List<Answer> list = answerMapper.selectList(wrapper);

        // 3. 关联用户信息和二级回复信息
        if (!list.isEmpty()) {
            for (Answer answer : list) {
                // 3.1 关联回复的用户信息
                User user = userMapper.selectById(answer.getUserId());
                answer.setUser(user);
                // 将用户对象设置到回复中

                // 3.2 处理二级回复（如果存在被回复的回复ID）
                if (answer.getReplayId() != null) {
                    Answer repliedAnswer = answerMapper.selectById(answer.getReplayId());
                    // 查询被回复的回复
                    User repliedUser = userMapper.selectById(repliedAnswer.getUserId());
                    // 关联被回复回复的用户
                    repliedAnswer.setUser(repliedUser);
                    // 设置被回复回复的用户信息
                    answer.setAnswer(repliedAnswer);
                    // 将被回复的回复对象设置到当前回复中
                }
            }
        }
        return list;
    }

    /**
     * 创建一级回复（直接回复评论）
     * @param userId 回复用户ID
     * @param commentId 所属评论ID
     * @param content 回复内容
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public Integer create(Integer userId, Integer commentId, String content) {
        // 构建回复对象
        Answer answer = new Answer();
        answer.setUserId(userId);
        // 设置回复用户ID
        answer.setCommentId(commentId);
        // 设置所属评论ID
        answer.setContent(content);
        // 设置回复内容
        answer.setAnswerTime(new Date());
        // 设置回复时间（当前时间）
        return answerMapper.insert(answer);
        // 插入数据库
    }

    /**
     * 根据回复ID查询回复详情（包含所属评论信息）
     * @param id 回复ID
     * @return 回复对象，包含关联的评论信息
     */
    @Override
    public Answer findById(Integer id) {
        // 1. 根据ID查询回复
        Answer answer = answerMapper.selectById(id);

        // 2. 关联所属评论信息
        if (answer != null) {
            Comment comment = commentMapper.selectById(answer.getCommentId());
            // 查询评论
            answer.setComment(comment);
            // 将评论对象设置到回复中
        }
        return answer;
    }

    /**
     * 创建二级回复（回复某条已有回复）
     * @param userId 回复用户ID
     * @param replayId 被回复的回复ID（二级回复标识）
     * @param content 回复内容
     * @param commentId 所属评论ID（与被回复的回复一致）
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public Integer creates(Integer userId, Integer replayId, String content, Integer commentId) {
        // 构建二级回复对象
        Answer answer = new Answer();
        answer.setUserId(userId);
        // 设置回复用户ID
        answer.setReplayId(replayId);
        // 设置被回复的回复ID（实现二级回复关联）
        answer.setCommentId(commentId);
        // 设置所属评论ID（需与被回复的回复所属评论一致）
        answer.setContent(content);
        // 设置回复内容
        answer.setAnswerTime(new Date());
        // 设置回复时间（当前时间）
        return answerMapper.insert(answer);
        // 插入数据库
    }
}